package cn.wolfcode.web.controller;


import cn.wolfcode.common.exception.BusinessException;
import cn.wolfcode.common.web.Result;
import cn.wolfcode.domain.OrderInfo;
import cn.wolfcode.feign.AlipayFeignApi;
import cn.wolfcode.service.IOrderInfoService;
import cn.wolfcode.web.msg.SeckillCodeMsg;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;


@RestController
@RequestMapping("/orderPay")
@RefreshScope
public class OrderPayController {
    @Autowired
    private IOrderInfoService orderInfoService;
    @Autowired
    private AlipayFeignApi alipayFeignApi;

    @Value("${pay.frontEndPayUrl}")
    private String frontEndPayUrl;

    @RequestMapping("/alipay")
    public Result<String> alipay(String orderNo, Integer type) {
        // 参数校验
        if (StringUtils.isEmpty(orderNo) || StringUtils.isEmpty(type + "") ) {
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        String fromStr = "";
        // 判断类型是在线支付还是积分支付
        if (OrderInfo.PAYTYPE_ONLINE.equals(type)) {
            // 走在线支付流程
            fromStr = orderInfoService.payOnline(orderNo,type);
            return Result.success(fromStr);
        } else if (OrderInfo.PAYTYPE_INTERGRAL.equals(type)) {
            // 走积分支付
            orderInfoService.payIntergral(orderNo,type);
        } else {
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        return Result.success("");
    }

    /**
     * 做数据展示
     * 让他重定向 到订单详情界面
     */
    @RequestMapping("/return_url")
    public void return_url(@RequestParam Map<String,String> params, HttpServletResponse response) throws IOException {
        System.out.println("同步回调 调用时间为: " + new Date());
        // 进行验签
         Result<Boolean> result = alipayFeignApi.checkSign(params); //调用SDK验证签名

        //——请在这里编写您的程序（以下代码仅作参考）——
        if(result!=null && !result.hasError()) {
            if (result.getData()) {
                // 跳转到订单详情界面  值+订单编号
                response.sendRedirect(frontEndPayUrl+params.get("out_trade_no"));
            }
        }else {
            // 跳转到错误界面
            response.sendRedirect("http://localhost/50x.html");
        }
    }

    @RequestMapping("/notify_url")
    public void notify_url(@RequestParam Map<String,String> params, HttpServletResponse response) throws IOException {
        System.out.println("异步回调 调用时间为: " + new Date());
        PrintWriter writer = response.getWriter();
        // 进行验签
        Result<Boolean> result = alipayFeignApi.checkSign(params); //调用SDK验证签名

        //——请在这里编写您的程序（以下代码仅作参考）——
        if(result!=null && !result.hasError()) {
            if (result.getData()) {
                // 支付成功业务逻辑
                orderInfoService.paySuccess(params);
                // 插入流水记录
                // 修改订单状态
                writer.write("success");
            }
        }else {
            // 跳转到错误界面
            writer.write("fail");
        }
    }

    @RequestMapping("/refund")
    public Result<String> refund(String orderNo,Integer type) throws IOException {
        // 1 参数非空校验
        if (StringUtils.isEmpty(orderNo)) {
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        // 2 根据订单编号查询出来订单信息
        OrderInfo orderInfo = orderInfoService.find(orderNo);
        // 3 判断支付类型是在线支付还是积分支付
        if (orderInfo.getPayType().equals(OrderInfo.PAYTYPE_ONLINE)) {
            // 走在线退款流程
            orderInfoService.refundOnline(orderInfo);
        } else if (orderInfo.getPayType().equals(OrderInfo.PAYTYPE_INTERGRAL)) {
            // 走积分退款流程
            orderInfoService.refundIntergral(orderInfo);
        } else {
            throw new BusinessException(SeckillCodeMsg.OPT_ERROR);
        }
        // 4 如果是在线支付在线退款流程
        // 4.1 插入流水记录
        // 4.2 远程调用支付服务进行退款操作
        // 4.3 修改订单状态为退款状态
        // 4.4 回补真实库存
        // 4.5 回补预库存
        // 4.6 修改本地标识
        return Result.success("");  // 返回空串,执行完业务逻辑,会刷新页面
    }
}
